#include "comm.h"

static int commShm(int size,int flags)
{
    key_t _key=ftok(PATHNAME,PROJ_ID);
    if(_key < 0)
    {
        perror("ftok");
        exit(-1);
    }
    int shmid=shmget(_key,size,flags);
    if(shmid < 0)
    {
        perror("shmget");
        exit(-2);
    }
    return shmid;
}
void destroyShm(int shmid)
{
    int ret=shmctl(shmid,IPC_RMID,nullptr);
    if(ret < 0)
    {
        perror("shmctl");
        exit(-1);
    }
}
int createShm(int size)
{
    return commShm(size,IPC_CREAT | IPC_EXCL | 0666);
}
int getShm(int size)
{
    //这里直接获取共享内存
    return commShm(size,IPC_CREAT);
}
// static int commShm(int size,int flags)
// {
//     //函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值
//     //称为IPC键值（也称IPC key键值）
//     //函数ftok把一个已经存在了的路径和一个自定义的证书标识符
// //转换成或者说是包装成一个key_t类型的值，简称IPC值
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
//     return shmid;
// }
// static int commShm(int size,int flags)
// {
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
//     //这里就是获取共享内存的唯一标识符
//     return shmid;
// }
// static int commShm(int size,int flags)
// {
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok()");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
//     return shmid;
// }
// int destroyShm(int shmid)
// {
//     //这里要返回共享内存相关属性的一个结构体指针
//     int ret=shmctl(shmid,IPC_RMID,nullptr);
//     if(ret < 0)
//     {
//         perror("shmctl");
//         exit(-1);
//     }
//     return 0;
// }
// int createShm(int size)
// {
//     return commShm(size,IPC_CREAT|IPC_EXCL|0666);
// }
// int getShm(int size)
// {
//     //这里返回一个共享内存
//     return commShm(size,IPC_CREAT);
// }
// static int commshm(int size,int flags)
// {
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok()");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
//     return shmid;
// }
// static int commshm(int size,int flags)
// {
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
// }
// static int commShm(int size,int flags)
// {
//     //这里的_key相当于是共享内存的一个名字
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok");
//         exit(-1);
//     }
//     int shmid=shmget(_key,size,flags);
//     if(shmid < 0)
//     {
//         perror("shmget");
//         exit(-2);
//     }
//     //这里的函数用于返回共享内存的id
//     return shmid;
// }

// int destroyShm(int shmid)
// {
//     //第三个参数这里是一个结构体指针，它指向共享内存模式
//     //和访问权限的结构体
//     if(shmctl(shmid,IPC_RMID,nullptr) < 0)
//     {
//         perror("shmctl");
//         exit(-1);
//     }
//     return 0;
// }

// int create(int size)
// {
//     return commShm(size,IPC_CREAT|IPC_EXCL|0666);
// }

// int getShm(int size)
// {
//     return commShm(size,IPC_CREAT);
// }
// static int commShm(int size,int flags)
// {
//     //这里需要根据路径给定一个随机值，来产生key_t
//     key_t _key=ftok(PATHNAME,PROJ_ID);
//     if(_key < 0)
//     {
//         perror("ftok");
//         exit(-1);
//     }
//     int shmid=0;
//     //获取共享内存的id
//     if(shmid = shmget(_key,size,flags) < 0)
//     {
//         perror("shmget");
//         return -2;
//     }
//     return shmid;
// }

// int destroyShm(int shmid)
// {
//     //这里指要删除共享内存段
//     if(shmctl(shmid,IPC_RMID,nullptr) < 0)
//     {
//         perror("shmctl");
//         return -1;
//     }
//     return 0;
// }

// int createShm(int size)
// {
//     //两个参数联合使用一定能够创建一个全新的内存,并且为他设置
//     //权限
//     return commShm(size,IPC_CREAT | IPC_EXCL | 0664);
// }

// int getShm(int size)
// {
//     return commShm(size,IPC_CREAT);
// }


















/*
int shmget(key_t key,size_t size,int shmflag);
这里的key就是这个共享内存段的名字
如果成功的话会返回一个非负整数，若失败的话返回-1

void* shmat(int shmid,const void* shmaddr,int shmflag)
shmid:共享内存的标识符
shmaddr:指定连接的地址
将共享内存连接到进程地址空间当中去
shmflag:它的两个可能取值是
return:如果成功返回一个指针，失败返回-1

int shmdt(const void* shmaddr)
由shmat所返回的指针
成功返回0，失败返回-1
注意将共享内存段与当前进程脱离并不等于删除共享内存段
*/